\subsection{Ein-/Ausgabe}
\label{subsec:IO}
Dieser Abschnitt stellt den in \RENGA verwendeten Mechnismus vor, der zum Laden und Speichern der Diagramme verwendet wird. Da Primitive, Operationen, Visualisierungen und Animationen fast v\"ollig frei austauschbar sind, muss auch der Ein-//Ausgabe-Mechanismus eine \"ahnlich Flexibilit\"at aufweisen. \\
Wie bereits in Abschnitt \ref{subsec:operationen} beschrieben m\"ussen alle Unterklassen von Operation zur Speicherung der eigenen Daten die Methode $writeYourself$ \"uberschreiben.\\
Ein \"ahnlich einfacher Mechanismus kann f\"ur das Einlesen leider nicht verwendet werden, da die Op\-era\-tion-Klassen nicht nur die eigenen Daten einlesen m\"ussen, sondern auch die Daten \"uber die Verbindungen zwischen einander. Zu diesem Zweck wurde ein zweiphasiger Algorithmus entwickelt. Zun\"achst laden alle Op\-era\-tion-Klassen die f\"ur sie wichtigen Daten und speichern sie in einer Datenbank, danach stellt eine weitere Phase die Verbindungen zwischen den Operationen wieder her.\\
Abbildung \ref{fig:io} zeigt das UML-Diagramm der einzelnen f\"ur
\RENGA verwendeten Klassen.

\begin{figure}[htp]
\centering
\includegraphics[scale=0.8,angle=90]{figures/io.ps}
\caption{IO Klassen}
\label{fig:io}
\end{figure}


\subsubsection{GlobalIO}
Die Klasse GlobalIO dient zum Lesen und Schreiben eines \textbf{\textit{RENGA}}-Programms. Zu diesem Zweck existieren die Methoden $apply$ und $write$.\\
Die $write$-Methode geht wie folgt vor:
\begin{enumerate}
\item{Erzeuge ein neues XML-Dokument}
\item{H\"ange die Ausgabe des $writeYourself$-Aufrufs der \"ubergebenen CompositeOperation an das XML-Dokument an.}
\item{Gib das XML-Dokument aus.}
\end{enumerate}
Die $apply$-Methode ist komplexer und dient dem Einlesen der Daten:
\begin{enumerate}
\item{Durchlaufe das \"ubergebene XML-Dokument}
\item{An jedem Knoten pr\"ufe das $type$-Attribut.}
\item{Laden den zum Typ Passenden $Reader$ aus der $OperationReaderRegistry$.}
\item{\"Ubergebe dem Reader den Knoten.}
\item{Setze bei 2. fort bis zum Ende des Dokuments.}
\item{Durchlaufe die Liste der Element vom Typ Operationen.}
\item{Verbinde die passenden Operationen anhand des $id$-Attributs.}
\item{Setze bei 6. fort bis zum Ende der Liste.}
\end{enumerate}

\subsubsection{OperationReader}
OperationReader ist ein Interface, das als Marker dient, um zu signaliseren, dass die implementierende Klasse zum Auslesen einer Operation-Klasse aus einer \RENGA Datei dient. Es selbst fordert keine Methoden-Implementierung, erweitert aber $UnaryFunction$, so dass eine implementierende Klasse die $apply$-Methode implementieren muss.

\subsubsection{VisualisationReader}
Wie auch Operationen sind Visualisationen beliebig austauschbar, so dass auch f\"ur sie ein entsprechender Mechanismus geschaffen werden musste. VisualisationReader funktioniert nach demselben Prinzip wie OperationReader.

\subsubsection{OperationReaderRegistry}
Die OperationReaderRegistry ist mittels eines Singleton-Patterns \cite{DesignPattern} implementiert und dient zur Speicherung der Reader. Sie bietet zu diesem Zweck Methoden zum Einf\"ugen und Abfragen von $Reader$. 